/*
 * Email.java
 * Copyright: Tsingsoft (c) 2015
 * Company: 北京清软创新科技有限公司
 */
package org.liang.email4j;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 邮件实体.
 * 
 * <pre>
 * 发送邮件使用
 * </pre>
 * 
 * @author L.Yang
 * @version 1.0, 2015年8月11日
 */
public class Email {

    /** 邮件发件人地址. */
    private String from;

    /** 邮件发送人名称. */
    private String fromname;

    /** 回复人地址. */
    private String replyto;

    /** 邮件主题 . */
    private String subject;

    /** 收件人,name＜address＞. */
    private List<String> to;

    /** 抄送人,name＜address＞. */
    private List<String> cc;

    /** 密送人,name＜address＞. */
    private List<String> bcc;

    /** 邮件内容. */
    private String msg;

    /** 附件地址. */
    private List<String> attachments;

    /** 邮件头. */
    private Map<String, String> headers;

    public Email() {
        to = new ArrayList<String>();
        cc = new ArrayList<String>();
        bcc = new ArrayList<String>();
        attachments = new ArrayList<String>();
        headers = new HashMap<String, String>();
    }

    /**
     * 获取邮件发件人 .
     * 
     * @return the from 发件人
     */
    public String getFrom() {
        return from;
    }

    /**
     * 设置邮件发件人 （显示名称）.
     * 
     * <pre>
     * 此方法与  {@link Email#setFrom(String,String)} 同时执行时，
     * 以后者设置的值为准。
     * 
     * 注意：
     * 使用submail的时候 from 必须为submail中认证过的域名；
     * 使用jodd时，from 无需设定 直接读取发送账户中的from;
     * </pre>
     * 
     * @param from
     *            the from to set
     */
    public Email setFrom(String from) {
        this.from = from;
        return this;
    }

    /**
     * 设置邮件发件人 （显示名称）.
     * 
     * <pre>
     * 此方法与 
     *  {@link Email#setFrom(String)} 
     *  {@link Email#setFromname(String)} 同时执行时，
     *  以后者设置的值为准。
     * 注意：
     * 使用submail的时候 from 必须为submail中认证过的域名；
     * 使用jodd时，from 无需设定 直接读取发送账户中的from;
     * </pre>
     * 
     * @param from
     *            the from to set
     * @param fromname
     *            the fromname to set
     */
    public Email setFrom(String from, String fromname) {
        this.from = from;
        this.fromname = fromname;
        return this;
    }

    /**
     * 获取邮件发件人（显示名称）.
     * 
     * @return the fromname 发件人
     */
    public String getFromname() {
        return fromname;
    }

    /**
     * 设置邮件收件人 （显示名称）.
     * 
     * <pre>
     * 此方法与  {@link Email#setFrom(String,String)} 同时执行时，
     *  以后者设置的值为准。
     * </pre>
     * 
     * @param fromname
     *            the fromname to set
     */
    public Email setFromname(String fromname) {
        this.fromname = fromname;
        return this;
    }

    /**
     * 获取 回复地址.
     * 
     * @return 返回 replyto
     */
    public String getReplyto() {
        return replyto;
    }

    /**
     * 设置 回复地址.
     * 
     * @param replyto
     *            the replyto to set
     */
    public Email setReplyto(String replyto) {
        this.replyto = replyto;
        return this;
    }

    /**
     * 获取主题.
     * 
     * @return the subject
     */
    public String getSubject() {
        return subject;
    }

    /**
     * 设置主题.
     * 
     * @param subject
     *            the subject to set
     */
    public Email setSubject(String subject) {
        this.subject = subject;
        return this;
    }

    /**
     * 获取收件人.
     * 
     * @return the to
     */
    public List<String> getTo() {
        return to;
    }

    /**
     * 设置收件人.
     * 
     * @param to
     *            the to to set
     */
    public Email setTo(List<String> to) {
        this.to = to;
        return this;
    }

    /**
     * 添加 收件人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param to
     *            收件人
     */
    public Email addTo(String to) {
        this.to.add(to);
        return this;
    }

    /**
     * 添加 收件人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param name
     *            收件人名称
     * @param address
     *            收件人地址
     */
    public Email addTo(String name, String address) {
        this.to.add(name + "<" + address + ">");
        return this;
    }

    /**
     * 添加 收件人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param tos
     *            收件人数组
     */
    public Email addTo(String[] tos) {
        this.to.addAll(Arrays.asList(tos));
        return this;
    }

    /**
     * 获取抄送.
     * 
     * @return the cc
     */
    public List<String> getCc() {
        return cc;
    }

    /**
     * 设置抄送.
     * 
     * @param cc
     *            the cc to set
     */
    public void setCc(List<String> cc) {
        this.cc = cc;
    }

    /**
     * 添加抄送人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param cc
     *            抄送人
     */
    public Email addCc(String cc) {
        this.cc.add(cc);
        return this;
    }

    /**
     * 添加抄送人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param name
     *            抄送人
     */
    public Email addCc(String name, String address) {
        this.cc.add(name + "<" + address + ">");
        return this;
    }

    /**
     * 添加抄送人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param ccs
     *            抄送人数组
     */
    public Email addCc(String[] ccs) {
        this.cc.addAll(Arrays.asList(ccs));
        return this;
    }

    /**
     * 获取密送.
     * 
     * @return the bcc
     */
    public List<String> getBcc() {
        return bcc;
    }

    /**
     * 设置 密送.
     * 
     * @param bcc
     *            the bcc to set
     */
    public void setBcc(List<String> bcc) {
        this.bcc = bcc;
    }

    /**
     * 添加密送人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param bcc
     *            密送人
     */
    public Email addBcc(String bcc) {
        this.bcc.add(bcc);
        return this;
    }

    /**
     * 添加密送人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param name
     *            密送人明火才呢过
     * @param address
     *            密送人地址
     */
    public Email addBcc(String name, String address) {
        this.bcc.add(name);
        return this;
    }

    /**
     * 添加密送人.
     * 
     * <pre>
     * 格式  name＜address＞
     * eg.张三＜zhangsan@xxx.com＞
     * </pre>
     * 
     * @param bccs
     *            密送人数组
     */
    public Email addBcc(String[] bccs) {
        this.bcc.addAll(Arrays.asList(bccs));
        return this;
    }

    /**
     * 获取邮件内容.
     * 
     * @return the msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     * 设置邮件内容.<br>
     * 如果所提供的模板编号不正确，则使用默认模板
     * 
     * @param templateID
     *            模板编号
     * @param args
     *            模板参数
     */
    public Email setMsg(String message) {
        this.msg = message;
        return this;
    }

    /**
     * 获取附件.
     * 
     * @return the attachments
     */
    public List<String> getAttachments() {
        return attachments;
    }

    /**
     * 设置附件.
     * 
     * @param attachments
     *            the attachments to set
     */
    public Email setAttachments(List<String> attachments) {
        this.attachments = attachments;
        return this;
    }

    /**
     * 添加 附件.
     * 
     * @param attachment
     *            附件路径
     */
    public Email addAttachment(String attachment) {
        this.attachments.add(attachment);
        return this;
    }

    /**
     * 获取 headers.
     * 
     * @return 返回 headers
     */
    public Map<String, String> getHeaders() {
        return headers;
    }

    /**
     * 设置 headers.
     * 
     * @param headers
     *            the headers to set
     */
    public void setHeaders(Map<String, String> headers) {
        this.headers = headers;
    }

    /**
     * 添加要设置的邮件头.
     * 
     * @param name
     *            头属性
     * @param value
     *            值
     */
    public void addHeaders(String name, String value) {
        this.headers.put(name, value);
    }
}